package br.np2tec.soa.analisarContrato;



import br.np2tec.soa.servicos.CreditosConcedidos;
import br.np2tec.soa.servicos.PropostaContrato;
import br.np2tec.soa.servicos.PropostaCredito;
import br.np2tec.soa.servicos.TratarCreditosConcedidosDataServiceService;
import br.np2tec.soa.servicos.TratarPropostaContratoDataServiceService;
import br.np2tec.soa.servicos.VerificarContratoRiscoServiceService;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebServiceRef;

public class AnalisarContratoServlet extends HttpServlet {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarPropostaContratoDataServiceService/TratarPropostaContratoDataService?WSDL")
    TratarPropostaContratoDataServiceService tratarPropostaContratoDataService;
    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarCreditosConcedidosDataServiceService/TratarCreditosConcedidosDataService?WSDL")
    TratarCreditosConcedidosDataServiceService tratarCreditosConcedidosDataService;
    @WebServiceRef(wsdlLocation = "http://localhost:8080/VerificarContratoRisco/VerificarContratoRiscoServiceService?WSDL")
    VerificarContratoRiscoServiceService verificarContratoRiscoService;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String comando = request.getParameter("comando");

        Class partypes[] = new Class[2];
        partypes[0] = HttpServletRequest.class;
        partypes[1] = HttpServletResponse.class;
        try {
            Class cls = this.getClass();

            Object arglist[] = new Object[2];
            arglist[0] = request;
            arglist[1] = response;

            Method meth = cls.getDeclaredMethod(comando, partypes);
            Object retobj = meth.invoke(this, arglist);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void listaPropostaContrato(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        List<PropostaContrato> listaPropostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().listarPropostaContrato();
        request.getSession().setAttribute("listaPropostaContrato", listaPropostaContrato);

        if (listaPropostaContrato == null || listaPropostaContrato.isEmpty()) {
            request.setAttribute("mensagem", "Não existem propostas de contrato cadastradas!");
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher("consultarPropostaContrato.jsp");
        dispatcher.forward(request, response);

    }

    protected void aprovar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Integer numeroContrato = Integer.valueOf(request.getParameter("numeroContrato"));
        PropostaContrato propostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().consultarPropostaContrato(numeroContrato);
        propostaContrato.setSituacao("Aprovado");
        tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().alterarPropostaContrato(propostaContrato);

        request.setAttribute("mensagem", "Contrato Aprovado com Sucesso!");
        listaPropostaContrato(request, response);
    }

    /**
     * Alterar a situação da proposta de contrato para “Cancelado por corresponder a contrato de risco” e a situação dos créditos concedidos é ajustada
     *   para “cancelado”.
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void cancelar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Integer numeroContrato = Integer.valueOf(request.getParameter("numeroContrato"));
        PropostaContrato propostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().consultarPropostaContrato(numeroContrato);
        propostaContrato.setSituacao("Cancelado por corresponder a contrato de risco");
        tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().alterarPropostaContrato(propostaContrato);

        CreditosConcedidos creditosConcedidos = propostaContrato.getCreditosConcedidos();
        tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().alterarCreditosConcedidos(creditosConcedidos.getPropostaCredito().getNumeroProposta(), "Cancelado", creditosConcedidos.getTaxaJuros(), creditosConcedidos.getValorTotalConcedido(), numeroContrato, null);

        request.setAttribute("mensagem", "Contrato Cancelado com Sucesso!");
        listaPropostaContrato(request, response);
    }

    protected void reduzirRisco(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Integer numeroContrato = Integer.valueOf(request.getParameter("numeroContrato"));
        PropostaContrato propostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().consultarPropostaContrato(numeroContrato);
        PropostaCredito propostaCredito = propostaContrato.getCreditosConcedidos().getPropostaCredito();

        //TODO - verificar o que será feito para passar os parâmetros modificados pelo analista de crédito ao invocar a operação reduzir risco
        propostaCredito.setValorFinanciado(666.66);
        propostaCredito.setNumeroParcelas(6);
        propostaCredito.setResultadoVerificacao("REDUZIR RISCO CONTRATO");

        verificarContratoRiscoService.getVerificarContratoRiscoServicePort().reduzirRiscoContrato(propostaCredito);
        
        request.setAttribute("mensagem", "Risco do Contrato Reduzido com Sucesso!");
        listaPropostaContrato(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
